#include "app_pool.h"
#include "log/log.h"    //日志
#include "pthread.h"
#include "mqueue.h" //消息队列
#include "stdlib.h"
static pthread_t *thread_pool; //线程池
static int thread_num; //县城池中县城数量
static char *mq_name = "/gatway_mq"; //县城池中县城名称
static mqd_t mq_fd; //
//县城吃中的县城函数->从消息队列中获取任务并执行
static void *thread_func(void *arg)
{
    Task task;
    while (1)
    {
        //从消息队列中获取任务
      ssize_t len =  mq_receive(mq_fd, (char *)&task, sizeof(Task), NULL);
      if (len == sizeof(Task))
      {
        task.task_func(task.arg);
      }
      
    }  
}
//初始化 线程池（里面的县城有多少）  消息队列
int app_pool_init(int num)
{
    thread_num = num;
    thread_pool = malloc(sizeof(pthread_t) * num);//创建线程池
    //创建多个县城，并保存到线程池中
    for (int i = 0; i < num; i++)
    {
        pthread_create(&thread_pool[i], NULL, thread_func, NULL);
    }
    //创建消息队列
    struct  mq_attr attr;
    attr.mq_maxmsg = 10;//消息队列中最大消息数量
    attr.mq_msgsize = sizeof(Task);//消息队列中每个消息的最大字节数
    mq_fd = mq_open(mq_name, O_CREAT | O_RDWR, 0644, &attr);
    if (mq_fd == -1)
    {
        log_error("创建消息队列失败");
        return -1;
    }
    return 0;
    

}
//关闭县城池 取消所有县城 关闭删除所有消息队列
void app_pool_destroy(void)
{
    //取消所有县城
    for (int i = 0; i < thread_num; i++)
    {
        pthread_cancel(thread_pool[i]);
        pthread_join(thread_pool[i], NULL);
    }
    //释放所有县城池的空间
free(thread_pool);
    //关闭消息队列
    mq_close(mq_fd);
    mq_unlink(mq_name);
}
//注册任务 向县城池中发送消息队列
int app_pool_registerTask(int (*task_func)(void *arg),void *arg)
{
    //创建任务
    Task task = {
        .task_func = task_func,
        .arg = arg
    };
    //向消息队列中发送任务
   return mq_send(mq_fd, (char *)&task, sizeof(Task), 0);

}